/*
 * NodoIndice.h
 *
 *  Created on: Sep 20, 2010
 *      Author: nicoabie
 */
#ifndef NODOINDICE_H_
#define NODOINDICE_H_

#include <sstream>
#include "Nodo.h"
#include "ReferenciaNodo.h"

class NodoIndice: public Nodo {

public:
	list<ReferenciaNodo*> 		referenciaAHijos;

private:
	/*
	 * Puede ser tanto un IUC para el indice
	 * primario como el de selección
	 * o bien un char* para el ìndice de
	 * clasificaciònnodoHijo
	 */
	list<string*>		keys;
	int				cantidadKeys;
	int				idHijoActual;

public:
	NodoIndice();
	void partir(Nodo* hojaHermana, long tamanioCubeta, char** keyAscendente, int* idNodoAscendente);
	void insertarKey(string key);
	void insertarNuevaKey(string key);
	void insertarKeyHija(char* key, int idHijo);
    void insertarKeyOrdenada(char* key);
	void insertarIdHijo(int idHijo);
	int insertarRegistro(Registro* registro);


    list<string*> getKeys() const;
    int getIdHijoDerecho(Nodo* nodoHijo);
    int getIdHijoIzquierdo(Nodo* nodoHijo);
	long getTamanioDatos();
	int getTamanioDatosControl();
	long getTamanioOcupado();
	long getTamanioLibreIzquierdo();
	long getTamanioLibreDerecho();
	char* getUltimaKey();//si estan ordenadas nos da la maxima
	string getPrimerKey();//si estan ordenadas nos da la minima
    int getCantidadKeys() const;
    void setCantidadKeys(int cantidadKeys);

    void setIdsNodosHijo(list<ReferenciaNodo*> nodosHijo);
    void setKeys(list<string*> keys);

    void persistir(iostream* ios);
    void hidratar(iostream* ios);

    string toString();

    void fromString(string stream);

    int fixOverflow(Nodo* nodo, int offset, fstream* arc, unsigned int* cantidadNodos, fstream* freefs, unsigned int* cantidadNodosLibres);


    virtual ~NodoIndice();

};

#endif /* NODOINDICE_H_ */

